package com.cencat.merchant.service;

import com.cencat.common.enums.AuditStatus;
import com.cencat.common.exception.BusinessException;
import com.cencat.merchant.dto.MerchantAuditDTO;
import com.cencat.merchant.vo.MerchantAuditHistoryVO;

import java.util.List;

/**
 * 商家审核服务接口
 * 
 * @author cencat
 * @since 2024-01-01
 */
public interface MerchantAuditService {

    /**
     * 提交商家审核
     * 
     * @param merchantId 商家ID
     * @param auditDTO 审核信息
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean submitAudit(Long merchantId, MerchantAuditDTO auditDTO) throws BusinessException;

    /**
     * 审核商家
     * 
     * @param merchantId 商家ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @param auditorId 审核人ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean auditMerchant(Long merchantId, AuditStatus auditStatus, String auditRemark, Long auditorId) throws BusinessException;

    /**
     * 批量审核商家
     * 
     * @param merchantIds 商家ID列表
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @param auditorId 审核人ID
     * @return 审核结果
     * @throws BusinessException 业务异常
     */
    Boolean batchAuditMerchants(List<Long> merchantIds, AuditStatus auditStatus, String auditRemark, Long auditorId) throws BusinessException;

    /**
     * 撤回审核
     * 
     * @param merchantId 商家ID
     * @param reason 撤回原因
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean withdrawAudit(Long merchantId, String reason) throws BusinessException;

    /**
     * 获取审核历史
     * 
     * @param merchantId 商家ID
     * @return 审核历史列表
     */
    List<MerchantAuditHistoryVO> getAuditHistory(Long merchantId);

    /**
     * 获取待审核商家列表
     * 
     * @param tenantId 租户ID
     * @param auditorId 审核人ID（可选）
     * @return 待审核商家列表
     */
    List<Long> getPendingAuditMerchants(Long tenantId, Long auditorId);

    /**
     * 检查商家是否可以审核
     * 
     * @param merchantId 商家ID
     * @param auditorId 审核人ID
     * @return 是否可以审核
     */
    Boolean canAudit(Long merchantId, Long auditorId);

    /**
     * 获取审核统计信息
     * 
     * @param tenantId 租户ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 审核统计信息
     */
    Object getAuditStatistics(Long tenantId, String startDate, String endDate);

    /**
     * 自动审核
     * 
     * @param merchantId 商家ID
     * @return 是否成功
     * @throws BusinessException 业务异常
     */
    Boolean autoAudit(Long merchantId) throws BusinessException;

    /**
     * 发送审核通知
     * 
     * @param merchantId 商家ID
     * @param auditStatus 审核状态
     * @param auditRemark 审核备注
     * @return 是否成功
     */
    Boolean sendAuditNotification(Long merchantId, AuditStatus auditStatus, String auditRemark);
}